/**
 * STC89C52有4个外部中断
 * STC89C52的外部中断有两种触发方式：下降沿触发和低电平触发
 * 
 * 外部中断0
 * IT0: 触发方式, 1:下降沿触发(下降沿才触发1次).  0:低电平触发(低电平会一直回调)
 * IE0: (timer flag)中断标志. 是否已经发生了中断
 * EX0: 外部中断1 使能
 * EA : 所有中断
 * PX0: 优先级设置
 */
#include <REGX52.H>

/**
 * 外部中断0 初始化
 */
void Int0_Init() {
    IT0 = 1;
    IE0 = 0;        //清除TF0标志           (timer flag)
    EX0 = 1;
    EA  = 1;
    PX0 = 1;        //设置高优先级, 能打断别的中断(红外接受要有实时性)
}

static void (*Int0_onTickListener)();
/**
 * 设置 外部中断0 监听, 下降沿回调
 * TODO 写成 addListener 模式
 * @param Int0_onTick 回调的函数指针, 示例: <br />
 *        static void Int0_onTick() {
 *            //do something...
 *        }
 *        //传入函数指针
 *        Int0_setOnTickListener(&Int0_onTick);
 */
void Int0_setOnTickListener(void (*Int0_onTick)()) {
    Int0_onTickListener = Int0_onTick;
}

void Int0_Routine(void) interrupt 0 {
    if (Int0_onTickListener) {
        Int0_onTickListener();
    }
    IE0 = 0;
}